package com.chamber.web.controller.bussiness;

import com.chamber.business.domain.Machine;
import com.chamber.business.service.MachineService;
import com.chamber.common.core.controller.BaseController;
import com.chamber.common.core.domain.AjaxResult;
import com.chamber.common.core.redis.RedisCache;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * 设备配对控制器
 */
@Slf4j
@RestController
@RequestMapping("/api/machine/pairing")
public class DevicePairingController extends BaseController {

    /**
     * 配对码缓存前缀
     */
    private static final String PAIRING_CODE_KEY_PREFIX = "pairing:code:";

    /**
     * 配对码有效期（分钟）
     */
    private static final int PAIRING_CODE_EXPIRATION = 10;

    @Autowired
    private RedisCache redisCache;

    @Autowired
    private MachineService machineService;

    /**
     * 获取设备配对码
     *
     * @param machineNum 设备编号
     * @return 配对码信息
     */
    @PostMapping("/code")
    public AjaxResult getPairingCode(@RequestBody Map<String, Long> params) {
        Long machineNum = params.get("machineNum");
        if (machineNum == null) {
            return AjaxResult.error("设备编号不能为空");
        }

        // 验证设备是否存在
        try {
            machineService.getMachineInfo(machineNum);
        } catch (Exception e) {
            log.error("获取设备信息失败", e);
            return AjaxResult.error("设备不存在或无法连接");
        }

        // 生成随机配对码
        String pairingCode = UUID.randomUUID().toString().substring(0, 8).toUpperCase();

        // 存储配对码到Redis，设置过期时间
        String cacheKey = PAIRING_CODE_KEY_PREFIX + machineNum;
        redisCache.setCacheObject(cacheKey, pairingCode, PAIRING_CODE_EXPIRATION, TimeUnit.MINUTES);

        // 返回配对码信息
        Map<String, Object> result = new HashMap<>();
        result.put("pairingCode", pairingCode);
        result.put("expiration", PAIRING_CODE_EXPIRATION);

        return AjaxResult.success(result);
    }

    /**
     * 验证设备配对码
     *
     * @param params 包含设备编号和配对码的参数
     * @return 验证结果
     */
    @PostMapping("/verify")
    public AjaxResult verifyPairingCode(@RequestBody Map<String, Object> params) {
        Long machineNum = Long.valueOf(params.get("machineNum").toString());
        String pairingCode = (String) params.get("pairingCode");

        if (machineNum == null || pairingCode == null) {
            return AjaxResult.error("设备编号和配对码不能为空");
        }

        // 从Redis获取存储的配对码
        String cacheKey = PAIRING_CODE_KEY_PREFIX + machineNum;
        String storedPairingCode = redisCache.getCacheObject(cacheKey);

        if (storedPairingCode == null) {
            return AjaxResult.error("配对码已过期或不存在");
        }

        // 验证配对码是否匹配
        if (!storedPairingCode.equals(pairingCode)) {
            return AjaxResult.error("配对码不正确");
        }

        return AjaxResult.success("配对码验证成功");
    }

    /**
     * 记录设备配对成功
     *
     * @param params 包含设备编号和用户ID的参数
     * @return 操作结果
     */
    @PostMapping("/success")
    public AjaxResult recordPairingSuccess(@RequestBody Map<String, Object> params) {
        Long machineNum = Long.valueOf(params.get("machineNum").toString());
        Long userId = Long.valueOf(params.get("userId").toString());

        if (machineNum == null || userId == null) {
            return AjaxResult.error("设备编号和用户ID不能为空");
        }

        // 从Redis删除配对码
        String cacheKey = PAIRING_CODE_KEY_PREFIX + machineNum;
        redisCache.deleteObject(cacheKey);

        // TODO: 在数据库中记录设备与用户的绑定关系
        // 这里需要添加相应的业务逻辑，将设备与用户进行绑定

        return AjaxResult.success("设备配对成功");
    }
}
